// 知识点1：如果一个类定义了自己的swap，那么算法将利用类自己的版本(重排顺序等算法)

// 知识点2：自定义版本的swap存在的必要性：我们不希望进行新的内存分配，只希望将其指针进行拷贝赋值(交换的本质)，省去不必要的内存分配，将函数定义为friend，以便访问private成员

// 知识点3：相对于拷贝控制成员，swap并不是不要的，但是对于那些分配了资源的类，定义swap可能是一种很重要的优化手段

// 知识点4：swap函数自定义版本与std中版本的重合问题：对于swap函数，其调用应该都是不加限定的，若加std::swap则调用的是标准库的版本，而标准库的版本在一定程度上是为了那些内置类型没有自定义版本的swap而准备的，若一个类有其自定义版本的swap函数，则我们就不应该使用std版本的。所以我们只要在前加上using
// std::swap声明，即可，在使用中，若有类特定的swap，其匹配程度则会优于std中的版本(616页有详解)

// 知识点5：在赋值运算符中使用swap，以传值的方式传入新对象，再进行拷贝赋值，在一定程度上会比较安全

// 见知识点4，因为其调用到最后使用的是std中的swap，不存在循环